整理五万条银行流水居然只需要30s? |Dirty Work互助者计划
// Dirty Work互助者计划
这里是AutoDocs新推出的专题栏目。
在这个专题栏目里面,我们将聚焦一些特定工作场景,分享一些有助于高效解决Dirty Work的小技巧。
希望在这些技巧的帮助下,大家可以提高自己的工作效率,早点下班!
本栏目中的内容来源主要包括AutoDocs团队成员、AutoDocs交流群内的群友交流讨论内容。
同时,我们也欢迎读者们的来稿,稿件一经录用,都有相应的奖励!
本文由AutoDocs超级厉害的实习生
@一直在努力的小邱 授权发布|
感谢作者为AutoDocs提供优质原创内容|
本文共计约2,400字,建议阅读时间7分钟。
Excel表格匹配是我们处理银行流水过程中经常需要处理的工作。
但是表格的格式、内容并不是固定且完全一致的。
本篇推送,将介绍正则表达式的用法,并通过实战演练,教你如何快速上手,轻松解决Dirty Work!
某天起床,我收到了小伙伴的一条求助信息,问我:
“Excel表格匹配怎么做?”
我心里想:这很简单啊!
用VLOOKUP函数不就解决了吗?
但听他描述完整个问题后,我整个人都傻了…
概括一下这位求助者的问题:
要把银行日记账和流水账按照时间、金额、对方户名一一匹配,如果只是采取普通加辅助列整理出来的只能将时间和金额匹配起来,但是却没办法匹配到对方户名。
对账是要将相同时间、相同账户、相同金额的记录在两个工作表中进行匹配。
但我们经常会遇到的情况是:现金日记账里只有摘要,但没有银行账户这个关键信息。
首先,我们来观察银行流水账和现金日记账两张表格的结构:
表1:银行流水账
表2:现金日记账
✅ 时间
✅ 金额
💡满足两个条件可以通过辅助列来完成匹配
但账户名怎么关联?
银行流水账有账户名这个关键字,但是现金日记账里却没有,怎么处理?
你可能会说:
“嘿嘿,分列不就解决了?用分隔符"-"对日记账的摘要进行分列操作,再用VLOOKUP匹配,轻松解决问题。”
但真实情况的表格一般如下所示:
表述五花八门,格式乱七八糟
不过上面的解决思路上有一点是对的:
要将摘要进行分列,提取出银行账户名
不过怎么确定在哪个位置进行分割提取关键信息呢?
Excel的分列功能面对形形色色的表述爱莫能助,
Power Query的分列好像也不太适用。
面对这种棘手的情况,我们可以借助正则表达式呀!
// 什么是正则表达式?
正则表达式(regular expression):是一种描述字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
例如:autodoc+s,可以匹配 autodocs、autodoccs、autodoccccccs 等,+ 号代表前面的字符必须至少出现一次。
因此,正则表达式可以简单粗暴地理解为一种匹配方法:
我们告诉计算机一段内容的内在规律(比如说手机号的11位数字)和我们需要的内容结构,计算机将会帮我们去做相应的匹配,并将找到的结果返还给我们。
相比之下,VLOOKUP的局限性在于:
只能告诉计算机:“帮我找Andy这个单词”,而不能跟计算机说:“帮我找出所有A开头的单词。”
划重点:正则表达式不是一个具体的内容,它是一个抽象的规律。
正则表达式的基本语法:正则表达式一个字符代表一个位置,一组[]代表一个范围,一组{}代表字符出现次数。
下面以匹配日期为例进行操作演示,试试我们刚学会的正则表达式。
基于不同的记录习惯,我们在Excel表中遇到各种各样的情况。看看上面的日期写法,#¥@%&*……。
如果让Excel自动提取每一个单元格里的日期内容,估计Excel都会崩溃。
那么我们人类又是怎么认出这些日期的呢?
因为我们知道,一般四个数字表示年份,两个数字的表示月份或者日号,中间加一些停顿符号或者文字分隔符,继而读出了具体的日期。
那我们就把这个内在的规律通过代码形式体现出来!
第一步:提取年份
年份的取值是由四个数字构成的,数字的取值范围是0-9,取值范围用[],字符出现次数用{},因此年份的正则表达式可以写为
[0-9] {4}
👇🏻
等下,年份可能只有两位数字!
所以年份的规律应该是,最少2个数字,最多4个数字!跟字符出现次数有关的,还是用{},可是怎么写呢?
[0-9]{2,4}表示,0-9范围内的数字最少出现两次,最多出现四次。
所以{}内的参数可有两个,逗号前的参数表示最少出现的次数,逗号后的参数表示最多出现的次数。
如果{}内参数只有一个,则表示出现的固定次数。
第二步:提取月份
根据大家的习惯,年份后面会出现天然的文字分隔符。
比如“年”、“/”、“-”或者“.”等符号,也就是说年份后面紧跟的字符是这几个字符中的某一个,用[]限定范围就可以啦!
注意,这里需要把'-'放在最后,否则会出错,因为'-'放在两个字符中间表示“至”的意思,0-9,0至9。因此如果要表示'-'字符本身,要把'-'放在最后,防止误会~
[0-9]{2,4}[年./-]
👇🏻
第三步:提取日期
我们已经提取了月份前面的所有内容啦,顺着这个思路一口气把月份和日号也拿下吧!
[0-9]{2,4}[年./-][0-9]{2}[月./-][0-9]{1,2}[日号]
👇🏻
咦,“21年12.12”没有高亮,为什么?
因为我们告诉计算机,最后一个字符是日或者号里面的其中一个,而21年12.12的结尾并不是“日”或者“号”那该怎么办呢?
实际上我们想表达的是,如果最后一位有字符就是在日和号里面二选一,没有也行。用{0,1}表达出现次数就好啦!
[0-9]{2,4}[年./-][0-9]{2}[月./-][0-9]{1,2}[日号]{0,1}
👇🏻
第四步:简化表达式
你看现在的这个表达式是不是有点冗长呢?
悄悄告诉你,正则表达式中含有丰富的元字符,我们可以直接用这些元字符代替!
这时,上述日期的正则表达式可以简化为:
\d{2,4}[年月日号./-]\d{0,2}[月日号./-]?\d{0,2}[月日号./-]?
👇🏻
看似复杂的正则表达式,其实也没有想象中那么难对吧!
// 实战演练
回到文章开头提出的问题,这五万多条数据看起来就很乱
那要怎么通过正则表达式怎么快速提取出人名和公司名呢?
不难发现,即便每个人的表达习惯不一样
一个完整的语句会包括主体、事件、对象这些基本要素
针对上述要素描述,我们可以试着找到一些内在规律:
人名前面可能会有其所属部门名称(xx部、BP中心-xx、xxxx项目组)
正则表达式:
'^.{1,3}部|组'
公司名前面可能会有“-”,且公司名的结尾都是“公司”(受篇幅的限制,数据只展示了一部分,法人名称结尾一般是“公司”或者“企业”字样)
正则表达式:
'-.+(公司)|(企业)$'
摘要中的动词大多为“支付”、“报销”、“申请”,而动词前面基本是人名
费用名称一般为“转移费”、“快递费”、“工程款”,即xx费,xx款
正则表达式:
'(支付)|(报销)|(申请)','.+[费款]'
Tada!
最后将选中的文本一键替换为空值就成功“清洗”出了我们想要的数据啦~
感谢看到这里,不知道有没有学会呢?
如果刚好遇到需要整理数据的情况就立马应用起来吧!
之后我们会继续在Dirty Work互助者栏目中分享更多让大家高效解决Dirty Work的外挂秘籍,也欢迎加入AutoDocs交流群,和我们一起探索更多提高工作效率的小技巧!
后台回复“加群”获得小助理的联系方式,拉你进AutoDocs交流群!
如果你觉得实用,就点一个“在看”吧!